﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Waiter.Common;
using DevComponents.DotNetBar.Controls;
using Waiter.DataLayer;

namespace Waiter.Controler
{
    class WorkShiftCtrl
    {
        /// <summary>
        /// Khởi tạo chi tiết ca làm việc cho nhân viên
        /// </summary>
        /// <param name="pStaffCode">Code nhân viên</param>
        /// <param name="pOPID">ID của người sử dụng</param>
        /// <param name="pAddDate">Ngày tạo</param>
        /// <param name="pUpdDate">Ngày chỉnh sửa</param>
        /// <returns></returns>
        public ResultStatus fsCreateNewWorkShift_Detail(string pStaffCode, string pOPID, DateTime pAddDate, DateTime pUpdDate)
        {
            WORK_SHIFTS_D itemWSD;

            try
            {
                //Kiểm tra chi tiết ca làm việc của nhân viên này đã tồn tại hay chưa
                List<WORK_SHIFTS_D> myWorkShiftD = CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds.Where(x => x.STAFF_CODE == pStaffCode).ToList();

                //Nếu đã tồn tại thì tiến hành xóa bỏ
                if (myWorkShiftD.Count > 0)
                {
                    foreach (var workShift in myWorkShiftD)
                    {
                        CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds.DeleteOnSubmit(workShift);
                    }

                    CommonGlobalVariable.globalDataContext.SubmitChanges();
                }


                //Tiến hành thêm mới
                //Get tất cả các ca làm việc
                List<WORK_SHIFT> lsWorkShift = CommonGlobalVariable.globalDataContext.WORK_SHIFTs.ToList();

                if (lsWorkShift.Count != 4)//Hiện tại thì chưa cung cấp chức năng điều chỉnh ca làm việc
                {
                    throw new Exception();
                }
                else
                {
                    //Tiến hành add thêm các ca làm việc.
                    foreach (var myWS in lsWorkShift)
                    {
                        itemWSD = new WORK_SHIFTS_D();
                        itemWSD.WORK_SHIFTS_CODE = myWS.CODE;
                        itemWSD.STAFF_CODE = pStaffCode;
                        itemWSD.DEL_FLG = false;
                        itemWSD.OPID = pOPID;
                        itemWSD.ADD_DATE = pAddDate;
                        itemWSD.UPD_DATE = pUpdDate;

                        CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds.InsertOnSubmit(itemWSD);
                    }

                    CommonGlobalVariable.globalDataContext.SubmitChanges();

                    return ResultStatus.SUCCESS;
                }

            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsCreateNewWorkShift_Detail",
                           CommonUtils.fsParamListToString(new object[4] { pStaffCode, pOPID, pAddDate, pUpdDate }),
                           ex.ToString());
            }

            return ResultStatus.ERROR;
        }

        /// <summary>
        /// Get danh sách ca làm việc của tất cả nhân viên
        /// </summary>
        /// <returns></returns>
        public List<VIEW_WorkShiftsByColumn> fsGetFullListWorkShift()
        {
            VIEW_WorkShiftsByColumn myWSC;
            List<VIEW_WorkShiftsByColumn> resultList = new List<VIEW_WorkShiftsByColumn>();

            try
            {
                //Get danh ca lam viec cua tat ca nhan vien
                var myWSList = from  stf in CommonGlobalVariable.globalDataContext.STAFFs
                               join  wsd in CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds on stf.CODE equals wsd.STAFF_CODE
                               where stf.CODE == wsd.STAFF_CODE
                               &     stf.DEL_FLG == false
                               //orderby stf.CODE, wsd.WORK_SHIFTS_CODE
                               select new VIEW_WorkShiftsByRow
                               {
                                    strWORK_SHIFTS_CODE = wsd.WORK_SHIFTS_CODE,
                                    strSTAFF_CODE = stf.CODE,
                                    strSTAFF_NAME = stf.NAME,
                                    bIsWork = wsd.DEL_FLG
                               };

                //Get danh sach nhan vien
                var myStaffList = myWSList.Select(x => x.strSTAFF_CODE).Distinct().ToList();

                foreach (var staff in myStaffList)
                {                    
                    //Get danh sách ca làm việc tương ứng với từng nhân viên
                    var myListWork = myWSList.Where(x => x.strSTAFF_CODE == staff).OrderBy(x => x.strWORK_SHIFTS_CODE).ToList();

                    //Get thông tin từng ca làm việc của nhân viên
                    myWSC = new VIEW_WorkShiftsByColumn();
                    myWSC.strSTAFF_CODE = myListWork[0].strSTAFF_CODE;
                    myWSC.strSTAFF_NAME = myListWork[0].strSTAFF_NAME;

                    myWSC.strWORK_SHIFTS_CODE_1 = myListWork[0].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_1 = myListWork[0].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_2 = myListWork[1].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_2 = myListWork[1].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_3 = myListWork[2].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_3 = myListWork[2].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_4 = myListWork[3].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_4 = myListWork[3].bIsWork;

                    resultList.Add(myWSC);
                }

                return resultList.OrderBy(x => x.strSTAFF_NAME).ToList();
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsGetFullListWorkShift",
                           "",
                           ex.ToString());
            }

            return null;
        }

        /// <summary>
        /// Get danh sách ca làm việc của tất cả nhân viên
        /// </summary>
        /// <returns></returns>
        public List<VIEW_WorkShiftsByColumn> fsGetListWorkShift(string pStaffCode, string pWorkStatus)
        {
            VIEW_WorkShiftsByColumn myWSC;
            List<VIEW_WorkShiftsByRow> myWSList = new List<VIEW_WorkShiftsByRow>();
            List<VIEW_WorkShiftsByColumn> resultList = new List<VIEW_WorkShiftsByColumn>();

            try
            {
                //Get danh ca lam viec cua tat ca nhan vien
                if (pStaffCode != string.Empty && pWorkStatus != string.Empty)
                {
                    myWSList = (from stf in CommonGlobalVariable.globalDataContext.STAFFs
                                   join wsd in CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds on stf.CODE equals wsd.STAFF_CODE
                                   join mst in CommonGlobalVariable.globalDataContext.MASTERs on stf.STATUS_CODE equals mst.CODE
                                   where stf.CODE == wsd.STAFF_CODE
                                      && stf.CODE == pStaffCode
                                      && stf.DEL_FLG == false
                                      && mst.CODE == pWorkStatus                                      
                                   select new VIEW_WorkShiftsByRow
                                   {
                                       strWORK_SHIFTS_CODE = wsd.WORK_SHIFTS_CODE,
                                       strSTAFF_CODE = stf.CODE,
                                       strSTAFF_NAME = stf.NAME,
                                       bIsWork = wsd.DEL_FLG//Có làm việc hay không (ko phải là xóa)
                                   }).ToList() ;
                }
                else if (pStaffCode != string.Empty)
                {
                    myWSList = (from stf in CommonGlobalVariable.globalDataContext.STAFFs
                                   join wsd in CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds on stf.CODE equals wsd.STAFF_CODE                                   
                                   where stf.CODE == wsd.STAFF_CODE
                                      && stf.CODE == pStaffCode
                                      && stf.DEL_FLG == false
                                   select new VIEW_WorkShiftsByRow
                                   {
                                       strWORK_SHIFTS_CODE = wsd.WORK_SHIFTS_CODE,
                                       strSTAFF_CODE = stf.CODE,
                                       strSTAFF_NAME = stf.NAME,
                                       bIsWork = wsd.DEL_FLG//Có làm việc hay không (ko phải là xóa)
                                   }).ToList();
                }
                else //pWorkStatus != String.Empty
                {
                    myWSList = (from stf in CommonGlobalVariable.globalDataContext.STAFFs
                                   join wsd in CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds on stf.CODE equals wsd.STAFF_CODE
                                   join mst in CommonGlobalVariable.globalDataContext.MASTERs on stf.STATUS_CODE equals mst.CODE
                                   where stf.CODE == wsd.STAFF_CODE
                                      && stf.DEL_FLG == false
                                      && mst.CODE == pWorkStatus 
                                   select new VIEW_WorkShiftsByRow
                                   {
                                       strWORK_SHIFTS_CODE = wsd.WORK_SHIFTS_CODE,
                                       strSTAFF_CODE = stf.CODE,
                                       strSTAFF_NAME = stf.NAME,
                                       bIsWork = wsd.DEL_FLG//Có làm việc hay không (ko phải là xóa)
                                   }).ToList();
                }

                //Get danh sach nhan vien
                var myStaffList = myWSList.Select(x => x.strSTAFF_CODE).Distinct().ToList();

                foreach (var staff in myStaffList)
                {
                    //Get danh sách ca làm việc tương ứng với từng nhân viên
                    var myListWork = myWSList.Where(x => x.strSTAFF_CODE == staff).OrderBy(x => x.strWORK_SHIFTS_CODE).ToList();

                    //Get thông tin từng ca làm việc của nhân viên
                    myWSC = new VIEW_WorkShiftsByColumn();
                    myWSC.strSTAFF_CODE = myListWork[0].strSTAFF_CODE;
                    myWSC.strSTAFF_NAME = myListWork[0].strSTAFF_NAME;

                    myWSC.strWORK_SHIFTS_CODE_1 = myListWork[0].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_1 = myListWork[0].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_2 = myListWork[1].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_2 = myListWork[1].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_3 = myListWork[2].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_3 = myListWork[2].bIsWork;
                    myWSC.strWORK_SHIFTS_CODE_4 = myListWork[3].strWORK_SHIFTS_CODE;
                    myWSC.bIS_WORK_4 = myListWork[3].bIsWork;

                    resultList.Add(myWSC);
                }

                return resultList.OrderBy(x => x.strSTAFF_NAME).ToList();
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsGetListWorkShift",
                           CommonUtils.fsParamListToString(new object[2] { pStaffCode, pWorkStatus }),
                           ex.ToString());
            }

            return null;
        }

        /// <summary>
        /// Cập nhật ca làm việc của nhân viên
        /// </summary>
        /// <param name="pStaffCode">Code nhân viên</param>
        /// <param name="pWorkShiftCode">Code ca làm việc</param>
        /// <param name="pIsWork">Có làm ca đó hay không. True = có, False = không</param>
        /// <returns></returns>
        public ResultStatus fsUpdateWorkShift(string pStaffCode, string pWorkShiftCode, bool pIsWork)
        {
            WORK_SHIFTS_D myWorkShift = new WORK_SHIFTS_D();

            try
            {
                myWorkShift = CommonGlobalVariable.globalDataContext.WORK_SHIFTS_Ds.SingleOrDefault(x => x.STAFF_CODE == pStaffCode && x.WORK_SHIFTS_CODE == pWorkShiftCode);

                if (myWorkShift.STAFF_CODE != String.Empty & myWorkShift.STAFF_CODE != "")//Nếu có data (không phải trị mặc định của kiểu dữ liệu)
                {
                    myWorkShift.DEL_FLG = pIsWork;
                    CommonGlobalVariable.globalDataContext.SubmitChanges();
                    return ResultStatus.SUCCESS;
                }   
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsUpdateWorkShift",
                           CommonUtils.fsParamListToString(new object[3] { pStaffCode, pWorkShiftCode, pIsWork }),
                           ex.ToString());
            }

            return ResultStatus.ERROR;
        }

        /// <summary>
        /// Load danh sách ca làm việc vào combobox
        /// </summary>
        /// <param name="cmb"></param>
        public void fsLoadWorkShiftList(ComboBoxEx cmb)
        {
            try
            {
                List<WORK_SHIFT> myWorkShiftList = CommonGlobalVariable.globalDataContext.WORK_SHIFTs.ToList();

                cmb.DataSource = myWorkShiftList;
                cmb.DisplayMember = "WORK_SHIFT_NAME";
                cmb.ValueMember = "CODE";
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsLoadWorkShiftList",
                           "",
                           ex.ToString());
                cmb.DataSource = null;
            }
        }

        public List<WORK_SHIFT> fsGetWorkShiftList()
        {
            try
            {
                return CommonGlobalVariable.globalDataContext.WORK_SHIFTs.ToList();
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsGetWorkShiftList",
                           "",
                           ex.ToString());
                return null;
            }
            
        }
        public WORK_SHIFT fsFindByCode(string code)
        {
            try
            {
                return CommonGlobalVariable.globalDataContext.WORK_SHIFTs.FirstOrDefault(q => q.CODE == code);
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR,
                           "WorkShiftCtrl.fsFindByCode",
                           CommonUtils.fsParamListToString(new object[1] { code }),
                           ex.ToString());
            }
            return null;
        }
    }
}
